home *** CD-ROM | disk | FTP | other *** search
Text File | 2000-10-06 | 12.6 KB | 390 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // SpriteWorld.h
- //
- // Portions are copyright: © 1991-94 Tony Myles, All rights reserved worldwide.
- //
- // Description: constants, structures, and prototypes for sprite worlds
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __SPRITEWORLD__
- #define __SPRITEWORLD__
-
- #ifndef __SWCOMMON__
- #include <SWCommonHeaders.h>
- #endif
-
- #ifndef __SPRITELAYER__
- #include <SpriteLayer.h>
- #endif
-
- #ifndef __SPRITEFRAME__
- #include <SpriteFrame.h>
- #endif
-
- #ifndef __SPRITE__
- #include <Sprite.h>
- #endif
-
- #ifndef __TILING__
- #include <Tiling.h>
- #endif
-
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #if PRAGMA_ALIGN_SUPPORTED
- #pragma options align=mac68k
- #endif
-
- ///--------------------------------------------------------------------------------------
- // sprite world error constants
- ///--------------------------------------------------------------------------------------
-
- enum
- {
- kSystemTooOldErr = 100, // < System 7.0
- kMaxFramesErr = 101, // attempt to exceed maximum number of frames for a sprite
- kInvalidFramesIndexErr = 102, // frame index out of range
- kNotCWindowErr = 103, // attempt to make a SpriteWorld from non-color WindowPtr
- kNilParameterErr = 104, // nil SpritePtr, FramePtr, etc.
- kWrongDepthErr = 105, // invalid pixel size for attempted function
- kWrongMaskErr = 106, // invalid mask type for attempted function
- kOutOfRangeErr = 107, // tileID, tileMap, or other value out of bounds
- kTilingNotInitialized = 108, // tiling hasn't been initialized
- kTilingAlreadyInitialized = 109, // tiling already initialized; can't be initialized again
- kNullTileMapErr = 110, // no TileMap has ever been created/loaded
- kTileMapNotLockedErr = 111, // the TileMap is not locked and can't be used until it is
- kAlreadyCalledErr = 112, // the function was already called and can't be called again
- kSpriteNotCompiledErr = 113, // the sprite must be compiled before drawProc can be set
- kBadParameterErr = 114, // a parameter that was passed to the function is invalid
- kSpriteAlreadyInLayer = 115, // the Sprite is already in a Layer, and can't be added to another
- kNilFrameErr = 116, // the Frame this function acts on is NIL
- kNotLockedErr = 117, // a structure that must be locked is not
- k68kOnlyErr = 118 // can only be used from 68k code
- };
-
- ///--------------------------------------------------------------------------------------
- // UpdateRectStruct data structure
- ///--------------------------------------------------------------------------------------
-
- typedef struct UpdateRectStruct UpdateRectStruct;
- typedef UpdateRectStruct *UpdateRectStructPtr;
-
- struct UpdateRectStruct
- {
- Rect updateRect; // this rect
- UpdateRectStructPtr nextRectStructP; // next rect struct
- };
-
-
- ///--------------------------------------------------------------------------------------
- // sprite world type definitions
- ///--------------------------------------------------------------------------------------
-
- typedef SW_FUNC void (*WorldMoveProcPtr)(
- SpriteWorldPtr spriteWorldP,
- SpritePtr followSpriteP);
-
- typedef SW_FUNC void (*CallBackPtr)(
- SpriteWorldPtr spriteWorldP);
-
- typedef void (*CleanUpCallBackPtr)( void );
-
- typedef SW_FUNC void (*DoubleDrawProcPtr)(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect *srcRectA,
- Rect *dstRectA,
- Rect *srcRectB,
- Rect *dstRectB);
-
- ///--------------------------------------------------------------------------------------
- // sprite world data structure
- ///--------------------------------------------------------------------------------------
-
- struct SpriteWorldRec
- {
- SpriteLayerPtr headSpriteLayerP; // head of the sprite layer linked list
- SpriteLayerPtr tailSpriteLayerP; // tail of the sprite layer linked list
- SpriteLayerPtr deadSpriteLayerP; // where SWRemoveSpriteFromAnimation puts Sprites
-
- UpdateRectStructPtr headUpdateRectP; // used by SWFlagRectAsChanged
-
- FramePtr extraBackFrameP; // used when adding a background behind tiles
- FramePtr backFrameP; // frame for the background
- FramePtr workFrameP; // work, or "mixing" frame
- FramePtr windowFrameP; // frame for drawing to the screen
-
- DrawProcPtr offscreenDrawProc; // callback for erasing sprites offscreen
- DrawProcPtr screenDrawProc; // callback for drawing sprite pieces onscreen
- DoubleDrawProcPtr doubleRectDrawProc; // callback for updating screen when scrolling
-
- CallBackPtr postEraseCallBack; // called after erasing sprites
- CallBackPtr postDrawCallBack; // called after drawing sprites
-
- Rect windRect; // holds windowFrameP->frameRect for easier access
- Rect backRect; // holds backFrameP->frameRect for easier access
- Rect originalWindRect; // used by SWChangeWorldRect and SWRestoreWindRect
- Rect originalBackRect; // used by SWChangeWorldRect and SWRestoreWindRect
-
- Rect visScrollRect; // rect that is copied to screen when scrolling
- Rect oldVisScrollRect; // visScrollRect from last frame
- Rect offscreenScrollRect; // same as visScrollRect, but local to offscreen
- short horizScrollRectOffset; // offset from offscreenScrollRect to visScrollRect
- short vertScrollRectOffset; // offset from offscreenScrollRect to visScrollRect
- short horizScrollDelta; // horizontal scrolling delta
- short vertScrollDelta; // vertical scrolling delta
- Rect scrollRectMoveBounds; // move bounds for visScrollRect
-
- WorldMoveProcPtr worldMoveProc; // pointer to the scrolling world move procedure
- SpritePtr followSpriteP; // pointer to the "follow sprite", or NULL
-
- TileMapStructPtr *tileLayerArray; // an array of all the tileMap layers
- short lastActiveTileLayer; // the last active tile layer
- Boolean tilingIsInitialized; // has the tiling been initialized yet?
- Boolean tilingIsOn; // are the tiling routines turned on?
- short **tilingCache; // two-dimensional tiling cache
- short numTilingCacheRows; // number of rows in tilingCache array
- short numTilingCacheCols; // number of cols in tilingCache array
- FramePtr *tileFrameArray; // array of tile framePtrs
- short *curTileImage; // array specifying the current frame of each tile
- short maxNumTiles; // number of elements in tileFrameArray
- short tileWidth; // width of each tile
- short tileHeight; // height of each tile
- long numTilesChanged; // number of rects in changedTiles array to update
- Rect *changedTiles; // array of rects of tiles that changed
- long changedTilesArraySize; // number of elements in changedTiles array
- TileChangeProcPtr tileChangeProc; // pointer to tile frame changing procedure
- TileRectDrawProcPtr tileRectDrawProc; // pointer to the function that draws tiles in a rect
- DrawProcPtr tileMaskDrawProc; // drawProc for drawing masked tiles in tile layers
- DrawProcPtr partialMaskDrawProc; // drawProc for drawing partialMask tiles above sprites
-
- GDHandle mainSWGDH; // GDH used by the SpriteWorld's offscreen areas. Taken from the GDH the SpriteWorld's window was initially created in.
- short pixelDepth; // SpriteWorld's depth
-
- short fpsTimeInterval; // milliseconds per frame of animation (1000/fps)
- unsigned long runningTimeCount; // running total time in milliseconds
- UnsignedWide lastMicroseconds; // value of previous Microseconds() call
- unsigned long timeOfLastFrame; // time (from runningTimeCount) of last frame
- VBLTaskRec vblTaskRec; // extended VBLTask record
- Boolean usingVBL; // is the VBL task installed?
- Boolean frameHasOccurred; // Has the SpriteWorld been processed?
- Boolean thereAreNonScrollingLayers; // used internally by SWProcessSpriteWorld
-
- Boolean pad1; // (note: Boolean is the same as an unsigned char)
-
- RGBColor backgroundColor; // background color for clear drawproc
- unsigned long backgroundValue; // background pixel value for clear blitters
-
- long userData; // reserved for user
- };
-
-
- ///--------------------------------------------------------------------------------------
- // sprite world globals
- ///--------------------------------------------------------------------------------------
-
- extern SpriteWorldPtr gSWCurrentSpriteWorld;
- extern SpritePtr gSWCurrentSpriteBeingDrawn;
-
- extern RgnHandle gSWCollisionSectRgn;
- extern RgnHandle gSWCollisionSpareRgn;
-
- extern CleanUpCallBackPtr gSWCleanUpCallBackP;
- extern SpriteWorldPtr gSWCleanUpSpriteWorldP;
-
- ///--------------------------------------------------------------------------------------
- // sprite world function prototypes
- ///--------------------------------------------------------------------------------------
-
-
- SW_FUNC OSErr SWEnterSpriteWorld(void);
-
- SW_FUNC void SWExitSpriteWorld(void);
-
- SW_FUNC OSErr SWCreateSpriteWorld(
- GDHandle mainGDH,
- SpriteWorldPtr *spriteWorldP,
- FramePtr windowFrameP,
- FramePtr backFrameP,
- FramePtr workFrameP,
- short maxDepth);
-
- SW_FUNC OSErr SWCreateSpriteWorldFromWindow(
- SpriteWorldPtr* spriteWorldP,
- CWindowPtr srcWindowP,
- Rect* worldRectP,
- Rect* offscreenRectP,
- short maxDepth);
-
- SW_FUNC void SWDisposeSpriteWorld(
- SpriteWorldPtr *spriteWorldPP);
-
- SW_FUNC void SWAddSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr spriteLayerP);
-
- SW_FUNC void SWRemoveSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr spriteLayerP);
-
- SW_FUNC void SWSwapSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr srcSpriteLayerP,
- SpriteLayerPtr dstSpriteLayerP);
-
- SW_FUNC SpriteLayerPtr SWGetNextSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr curSpriteLayerP);
-
- SW_FUNC void SWLockSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWUnlockSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetPortToBackground(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetPortToWorkArea(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetPortToWindow(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC OSErr SWSetSpriteWorldOffscreenDrawProc(
- SpriteWorldPtr spriteWorldP,
- DrawProcPtr offscreenProc);
-
- SW_FUNC OSErr SWSetSpriteWorldScreenDrawProc(
- SpriteWorldPtr spriteWorldP,
- DrawProcPtr drawProc);
-
- SW_FUNC void SWSetPostEraseCallBack(
- SpriteWorldPtr spriteWorldP,
- CallBackPtr callBack);
-
- SW_FUNC void SWSetPostDrawCallBack(
- SpriteWorldPtr spriteWorldP,
- CallBackPtr callBack);
-
- SW_FUNC void SWSetSpriteWorldMaxFPS(
- SpriteWorldPtr spriteWorldP,
- short framesPerSec);
-
- SW_FUNC void SWSetBackgroundColor(
- SpriteWorldPtr spriteWorldP,
- RGBColor *color);
-
- SW_FUNC void SWStdWorldClearDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect);
-
- SW_FUNC void SWStdWorldDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect);
-
- SW_FUNC void SWInterlacedCopyBitsDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect);
-
- SW_FUNC void SWCopyBackgroundToWorkArea(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC OSErr SWChangeWorldRect(
- SpriteWorldPtr spriteWorldP,
- Rect* newWorldRect,
- Boolean changeOffscreenAreas);
-
- SW_FUNC void SWRestoreWorldRect(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWWindowMoved(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWWindowFrameMoved(
- FramePtr windowFrameP,
- Rect *frameRect);
-
- SW_FUNC void SWUpdateWindow(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWUpdateSpriteWorld(
- SpriteWorldPtr spriteWorldP,
- Boolean updateWindow);
-
- SW_FUNC void SWProcessSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWProcessNonScrollingLayers(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWProcessSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr curSpriteLayerP);
-
- SW_FUNC void SWAnimateSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWCheckIdleSpriteOverlap(
- SpriteWorldPtr spriteWorldP,
- SpritePtr idleSpriteP,
- SpritePtr headActiveSpriteP);
-
- SW_FUNC void SWCheckIdleSpritesWithTiles(
- SpriteWorldPtr spriteWorldP,
- SpritePtr headIdleSpriteP);
-
- SW_FUNC void SWCheckIdleSpritesWithRects(
- SpriteWorldPtr spriteWorldP,
- SpritePtr headIdleSpriteP);
-
- SW_FUNC void SWFindSpritesToBeRemoved(
- SpriteWorldPtr spriteWorldP );
-
- SW_FUNC OSErr SWFlagRectAsChanged(
- SpriteWorldPtr spriteWorldP,
- Rect* theChangedRect);
-
- SW_FUNC OSErr SWFlagScrollingRectAsChanged(
- SpriteWorldPtr spriteWorldP,
- Rect* theChangedRect);
-
- SW_FUNC OSErr SWSyncSpriteWorldToVBL(
- SpriteWorldPtr spriteWorldP,
- Boolean syncingOn);
-
- SW_FUNC void SWSetCleanUpSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetCleanUpFunction(
- CleanUpCallBackPtr callBackP);
-
- SW_FUNC unsigned long SWGetSpriteWorldVersion( void );
-
-
- #if GENERATINGCFM
- void SWVBLTask(VBLTaskRecPtr vblTaskPtr);/* Under CFM, we're passed the VBL task pointer */
- #else
- void SWVBLTask(void); /* Otherwise, we'll have to get it out of register A0 */
- #endif
-
-
- #if PRAGMA_ALIGN_SUPPORTED
- #pragma options align=reset
- #endif
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif /* __SPRITEWORLD__ */